import numpy as np

class Bunch(dict):
    """容器对象，继承自dict，可以像访问字典一样访问数据，也可以通过属性访问"""

    def __init__(self, **kwargs):
        super().__init__(kwargs)
        self.__dict__ = self
        print(self.__dict__)

    def __repr__(self):
        keys = list(self.keys())
        keys.remove('data') if 'data' in keys else None
        keys.remove('target') if 'target' in keys else None
        info = f"数据集对象，包含以下属性: data, target"
        if keys:
            info += f", {', '.join(keys)}"
        return info

class DatasetLoader:
    """数据集加载器类"""

    @staticmethod
    def load_custom_iris():
        """加载自定义鸢尾花数据集"""
        # 鸢尾花数据集的前几个样本
        data = np.array([
            [5.1, 3.5, 1.4, 0.2],
            [4.9, 3.0, 1.4, 0.2],
            [4.7, 3.2, 1.3, 0.2],
            [4.6, 3.1, 1.5, 0.2],
            [5.0, 3.6, 1.4, 0.2],
            [7.0, 3.2, 4.7, 1.4],
            [6.4, 3.2, 4.5, 1.5],
            [6.9, 3.1, 4.9, 1.5],
            [5.5, 2.3, 4.0, 1.3],
            [6.5, 2.8, 4.6, 1.5],
            [6.3, 3.3, 6.0, 2.5],
            [5.8, 2.7, 5.1, 1.9],
            [7.1, 3.0, 5.9, 2.1],
            [6.3, 2.9, 5.6, 1.8],
            [6.5, 3.0, 5.8, 2.2]
        ])

        target = np.array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2])

        feature_names = ['sepal length (cm)', 'sepal width (cm)',
                         'petal length (cm)', 'petal width (cm)']
        target_names = ['setosa', 'versicolor', 'virginica']

        description = """
        自定义鸢尾花数据集
        =================

        :样本数量: 15 (3个类别，每类5个样本)
        :特征数量: 4
        :特征信息:
            - sepal length in cm: 花萼长度
            - sepal width in cm:  花萼宽度  
            - petal length in cm: 花瓣长度
            - petal width in cm:  花瓣宽度
        :类别:
            - 0: setosa (山鸢尾)
            - 1: versicolor (变色鸢尾)
            - 2: virginica (维吉尼亚鸢尾)
        """

        return Bunch(
            data=data,
            target=target,
            feature_names=feature_names,
            target_names=target_names,
            DESCR=description.strip(),
            filename="custom_iris.csv"
        )

# 使用示例
def load_custom_iris():
    """全局函数，模仿sklearn的load_iris"""
    return DatasetLoader.load_custom_iris()

# 测试使用
if __name__ == "__main__":
    # 测试自定义鸢尾花数据集
    iris_data = load_custom_iris()
    print("=== 自定义鸢尾花数据集 ===")
    print(iris_data)
    # print(f"数据形状: {iris_data.data.shape}")
    # print(f"标签形状: {iris_data.target.shape}")
    # print(f"特征名称: {iris_data.feature_names}")
    # print(f"类别名称: {iris_data.target_names}")
    # print(f"描述信息:\n{iris_data.DESCR}")
    #
    # print("\n" + "=" * 50 + "\n")

